package org.opens.javaskill.mytools;

import cn.hutool.core.collection.CollectionUtil;
import org.junit.Test;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/**
 * 说明:
 *      1. 命名为CollectionUtil3是为了避免和其他的工具类冲突.
 */
public class CollectionUtil3 {

    /**
     * 功能:
     *      1. 比较两个List中的内容是否相同, 忽略顺序.
     * 注意:
     *      1. 这样定义可以保证两个参数的T必须是一致的, 否则会报错泛型找不到.
     */
    public static <T> boolean isSameDisorder(List<T> source1, List<T> source2) {
        if ( source1 == null || source2 == null ) {
            return false;
        }

        int source1Length = source1.size();
        int source2Length = source2.size();
        // 这里只需要判断source1Length或者source2Length中的一个为0即可, 因为另一个不为0的话就不会满足下一个条件.
        if (source1Length == 0 || source1Length != source2Length) {
            return false;
        }

        int sameTimes = 0;
        for (T t : source1) {
            if (source2.contains(t)) {
                sameTimes++;
            } else {
                // 只要有一次不相同, 就立即退出
                break;
            }
        }

        return source1Length == sameTimes;
    }

    @Test
    public void test1() {
        List<String> stringList = new ArrayList<>();
        stringList.add("1");
        stringList.add("2");
        stringList.add("3");

        List<Integer> integerList = new ArrayList<>();
        integerList.add(1);
        integerList.add(2);
        integerList.add(3);

        List<Integer> integerList1 = Arrays.asList(1, 2, 3);
        List<String> stringList1 = Arrays.asList("1", "2", "3");

        System.out.println(isSameDisorder(stringList, stringList1));
        System.out.println(isSameDisorder(integerList, integerList1));

        integerList.add(4);
        System.out.println(isSameDisorder(integerList, integerList1));
        System.out.println(isSameDisorder(null, null));

        System.out.println(CollectionUtil.containsAll(stringList, stringList1));
    }

}
